#ifndef __USART_H
#define __USART_H

#include "stm32f10x.h"

/**
 * ���ں궨�壬��ͬ�Ĵ��ڹ��ص����ߺ�IO��һ������ֲʱ��Ҫ�޸��⼸����
 * 1-�޸�����ʱ�ӵĺ꣬uart1���ص�apb2���ߣ�����uart���ص�apb1����
 * 2-�޸�GPIO�ĺ�
 */

// 串口1-USART1
#define DEBUG_USARTx USART1
#define DEBUG_USART_CLK RCC_APB2Periph_USART1
#define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd
#define DEBUG_USART_BAUDRATE 115200

// USART GPIO 引脚宏定义
#define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA)
#define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd

#define DEBUG_USART_TX_GPIO_PORT GPIOA
#define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9
#define DEBUG_USART_RX_GPIO_PORT GPIOA
#define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10

#define DEBUG_USART_IRQ USART1_IRQn
#define DEBUG_USART_IRQHandler USART1_IRQHandler

// ����2-USART2
// #define  DEBUG_USARTx                   USART2
// #define  DEBUG_USART_CLK                RCC_APB1Periph_USART2
// #define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
// #define  DEBUG_USART_BAUDRATE           115200

//// USART GPIO ���ź궨��
// #define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)
// #define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
//
// #define  DEBUG_USART_TX_GPIO_PORT         GPIOA
// #define  DEBUG_USART_TX_GPIO_PIN          GPIO_Pin_2
// #define  DEBUG_USART_RX_GPIO_PORT       GPIOA
// #define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_3

// #define  DEBUG_USART_IRQ                USART2_IRQn
// #define  DEBUG_USART_IRQHandler         USART2_IRQHandler

// ����3-USART3
// #define  DEBUG_USARTx                   USART3
// #define  DEBUG_USART_CLK                RCC_APB1Periph_USART3
// #define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
// #define  DEBUG_USART_BAUDRATE           115200

//// USART GPIO ���ź궨��
// #define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOB)
// #define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
//
// #define  DEBUG_USART_TX_GPIO_PORT         GPIOB
// #define  DEBUG_USART_TX_GPIO_PIN          GPIO_Pin_10
// #define  DEBUG_USART_RX_GPIO_PORT       GPIOB
// #define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_11

// #define  DEBUG_USART_IRQ                USART3_IRQn
// #define  DEBUG_USART_IRQHandler         USART3_IRQHandler

// ����4-UART4
// #define  DEBUG_USARTx                   UART4
// #define  DEBUG_USART_CLK                RCC_APB1Periph_UART4
// #define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
// #define  DEBUG_USART_BAUDRATE           115200

//// USART GPIO ���ź궨��
// #define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC)
// #define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
//
// #define  DEBUG_USART_TX_GPIO_PORT         GPIOC
// #define  DEBUG_USART_TX_GPIO_PIN          GPIO_Pin_10
// #define  DEBUG_USART_RX_GPIO_PORT       GPIOC
// #define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_11

// #define  DEBUG_USART_IRQ                UART4_IRQn
// #define  DEBUG_USART_IRQHandler         UART4_IRQHandler

// ����5-UART5
// #define  DEBUG_USARTx                   UART5
// #define  DEBUG_USART_CLK                RCC_APB1Periph_UART5
// #define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd
// #define  DEBUG_USART_BAUDRATE           115200

//// USART GPIO ���ź궨��
// #define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD)
// #define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
//
// #define  DEBUG_USART_TX_GPIO_PORT         GPIOC
// #define  DEBUG_USART_TX_GPIO_PIN          GPIO_Pin_12
// #define  DEBUG_USART_RX_GPIO_PORT       GPIOD
// #define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_2

// #define  DEBUG_USART_IRQ                UART5_IRQn
// #define  DEBUG_USART_IRQHandler         UART5_IRQHandler

// 将各串口进行枚举，以对应串口配置结构体数组的
typedef enum
{
  COM1,
  COM2,
  COM3,
  COM4,
  COM5,
  COM_MAX // 最大串口数量
} COM_Enum;

// 定义USART属性结构体
typedef struct
{
  uint32_t USART_GPIO_CLK; // USART的GPIO时钟使能
  GPIO_TypeDef *rxd_port;  // 接收数据GPIO端口
  uint32_t rxd_pin;        // 接收数据GPIO引脚
  GPIO_TypeDef *txd_port;  // 发送数据GPIO端口
  uint32_t txd_pin;        // 发送数据GPIO引脚

  uint32_t USART_CLK;    // USART时钟使能
  USART_TypeDef *USARTx; // 指向USART外设的指针
  IRQn_Type USARTx_IRQn; // USART中断向量号
} USART_PropertyTypeDef;

// 将存储使用的地址、空位偏移量、存储完成标志和缓存大小进行封装
#define RECV_MAX_LEN 256 // 字符串大小，即缓存大小

typedef struct
{
  u8 finish;    // 完成标志位
  char *buf;    // 缓存区指针，在使用时先指向一个静态空间，实现了可以灵活的对应各个串口的缓存需求
  u16 buf_size; // 指针指向的缓存区大小
  u16 index;    // 空位偏移，空位所在位置，下次数据写入时的存放位置
} UsartRecvMsgType;


void SerialPortInit(COM_Enum comx, u32 baud);
void usart_receive_str(COM_Enum comx, u8 c);
u16 usart_get_msg(COM_Enum comx, char *mem, u16 len);
void usart_send_msg(COM_Enum comx, const char *msg);
void usart_clear_msg(COM_Enum comx);

#endif /* __USART_H */
